<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 继承1 原型链继承
      // 缺点，自类实例修改属性，可能会导致所有的实例属性都被修改
      //   function Aniaml() {}
      //   Aniaml.prototype = {
      //     constructor: Aniaml,
      //     name: "animal",
      //     eat(food) {
      //       console.log(`${this.name}吃了${food}`);
      //     },
      //     aa: []
      //   };

      //   function Dog(name) {
      //     this.name = name;
      //   }
      //   // 原本的查找路是 dog.eat -> dog.__proto__.eat(Dog.prototype) -> dog.__proto__.__proto__.eat(Object.prototype)
      //   // 现在增加了一个查找 dog.eat -> dog.__proto__.eat(Dog.prototype) -> dog.__proto__.__proto__.eat(Animal.prototype) -> Object.prototype.eat
      // //   Dog.prototype.__proto__ = Aniaml.prototype;
      //   // 相较于上面一种，好处是可以使用父类的
      // //   Dog.prototype = new Aniaml()

      //   const dog1 = new Dog("旺财");
      //   dog1.eat("骨头");
      //   console.log(dog1.aa)
      //   dog1.aa.push('2323')
      //   const dog2 = new Dog("小花");
      //   dog2.eat("狗粮");
      //   console.log(dog2.aa)
      //   function Cat(name) {
      //     this.name = name;
      //   }
      //   const cat1 = new Dog("警长");
      //   cat1.eat("老鼠");
      //   console.log(cat1.aa)

      // 继承2
      // function Animal(name) {
      //     this.name = name
      // }

      // Animal.prototype.eat = () =>  {
      //     console.log(`${this.name}吃了${this.food}`)
      // }

      // function Dog(food, name) {
      //     this.food = food
      //     Animal.call(this, name)
      // }

      // const dog1 = new Dog('骨头', '小花')
      // console.log(dog1)
      // dog1.eat() // 报错，未继承原型属性

      function Parent(sex) {
        this.sex = sex;
      }

      Parent.prototype.setSex = function () {};
      Parent.prototype.arr = [1]

      function Son(name, age, sex) {
        // 这里可以继承Parent的实例属性
        Parent.call(this, sex);
        this.name = name;
        this.age = age;
      }
      // 继承Parent的原型属性
      Son.prototype = Object.create(Parent.prototype);
      Son.prototype.__proto__ === Parent.prototype
      Son.prototype.constructor = Son;
      var s1 = new Son("DBCdouble", 25, "男");
      var s2 = new Son("sadsda", 23, "女");
      console.log(s1);
      console.log(s1.arr === s2.arr)
      console.log(s2.arr)

    </script>
  </body>
</html>
